import java.util.Stack;

/**
 * @author : zzr
 * @description :逆波兰算法
 * @date :
 */
public class Test4 {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for(String s : tokens) {
            if(!isOpearation(s)) {
                //此时 s 是数字 要往栈中存放
                //但 s 的类型是String，因为要将栈中的数字进行计算，所以栈中的类型是Integer
                stack.push(Integer.parseInt(s));
            } else {
                //此时 s 是算术符 碰到算术符号 要将栈顶的两个元素弹出
                int num2 = stack.pop(); //第一个弹出的元素要放在算术符的右边
                int num1 = stack.pop(); //第二个弹出的元素要放在算术符的左边
                //进行计算 -- 想到计算器的+ - * / --> switch
                switch(s) {
                    case "+":
                        stack.push(num1 + num2); //注意：还要将计算完的值再压入栈中
                        break;
                    case "-":
                        stack.push(num1 - num2);
                        break;
                    case "*":
                        stack.push(num1 * num2);
                        break;
                    case "/":
                        stack.push(num1 / num2);
                        break;
                }
            }
        }
        return stack.pop(); //遍历完字符串数组之后，栈中剩下的最后一个值就是结果
    }

    private boolean isOpearation(String s) {
        if(s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
            return true;
        }
        return false;
    }
}
